# -*- coding: utf-8 -*-

import base
from memoriaException import MemoriaException

class Memoria:
    
    def __init__(self, posicoes, registrador_dados, registrador_endereco, ponto_controle):
        self._memoria = ['0' * base.TAM] * posicoes;
        self._reg_dados = registrador_dados
        self._reg_end = registrador_endereco
        self._ponto_controle = ponto_controle
        self._valor = '0' * base.TAM
        
    def _leitura(self):
        self._checha_posicao()
        self._valor = self._memoria[posicao]
    
    def _escrita(self):
        posicao = self.reg_end.valor
        valor = self.reg_dados.valor
        
        self._checha_posicao(posicao)
        if len(valor) < base.TAM :
            falta = base.TAM - len(valor)
            valor = '0'*falta + valor
        self._memoria[posicao] = valor
    
    def clock(self):
        if self._ponto_controle.flag == '0': #Leitura
            self._leitura()
        else : #Escrita
            self._escrita()
    
    def _checa_posicao(self):
        posicao = self.reg_end.valor
        if posicao > len(self._memoria):
            raise MemoryException(posicao)
        elif posicao < 0:
            raise MemoryException(posicao)

    def _get_valor(self):
        return self._valor

    valor = property(fget = _get_valor)
